package com.atguigu.util;

import com.google.common.base.CaseFormat;
import org.apache.commons.beanutils.BeanUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

public class JdbcUtil {
    // 泛型方法 <T>List<T>             // 泛型对象的类型传进来，表字段的类型转换
    public static <T> List<T> queryList(Connection connection, String querySql, Class<T> clz, boolean underScoreToCamel) throws Exception {

        // todo 创建集合用于存放结果数据
        ArrayList<T> list = new ArrayList<>();
        // 编译sql
        PreparedStatement preparedStatement = connection.prepareStatement( querySql );
        // 执行查询
        ResultSet resultSet = preparedStatement.executeQuery();
        // 查询结果集中的元数据信息 元数据中有列名
        ResultSetMetaData metaData = resultSet.getMetaData();
        int columnCount = metaData.getColumnCount();

        // 遍历查询结果，将每行数据转换为 T 对象放入集合
        while (resultSet.next()) {
            //  todo 构建 T 对象
            T t = clz.newInstance();
            //  todo 难点 ：遍历 列
            for (int i = 0; i < columnCount; i++) {
                // todo  获取列名和数据
                String columnName = metaData.getColumnName( i + 1 );
                Object value = resultSet.getObject( columnName );

                // todo  处理列名问题  如果为true，把小写的下划线转成小驼峰
                if (underScoreToCamel) {
                    columnName = CaseFormat.LOWER_UNDERSCORE.to
                            ( CaseFormat.LOWER_CAMEL, columnName.toLowerCase() );
                }
                BeanUtils.setProperty( t, columnName, value );
            }
            //  将封装好的 T 对象添加至集合
            list.add( t );
        }
        // 释放资源
        resultSet.close();
        preparedStatement.close();
        // connection 是外部传进来的，不能关闭，连接在哪创建就在哪回收

        // todo 返回集合
        return list;
    }
}
